package cc.wanforme.text2class;

import cc.wanforme.text2class.entity.AnalysisConfig;
import cc.wanforme.text2class.entity.BeanField;
import cc.wanforme.text2class.handler.BaseDataAnalysis;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 源数据解析成 BeanClass 和 BeanField
 */
public class ScJPADataAnalysis extends BaseDataAnalysis {

    /** 前置处理 */
    @Override
    public String beforeAnalysis(String rawLine, AnalysisConfig config) {
        // 'id long主键No'  =>  'id long 主键No'
//        String re = rawLine.replace("long", "long ")
//                .replace("number", "number ")
//                .replace("string", "string ")
//                .replace("integer", "integer ");
//        return re;
        return rawLine;
    }

    /** 使用空格拆分元素
     * @param str 行数据
     * */
    @Override
    public List<String> cutElements(String str, AnalysisConfig config) {
        String [] items = str.trim().split(" ");
        boolean mergeWhiteSpace = config.isMergeWhiteSpace();
        List<String> arr = Arrays.stream(items).filter(s -> {
            if (mergeWhiteSpace) {
                return !s.trim().isEmpty();
            }
            return true;
        }).collect(Collectors.toList());

//        return arr;
        // custom进一步处理! 'id long主键No'  =>  'id long 主键No'
        List<String> re = new ArrayList<>();
        re.add(arr.get(0));

        String s = arr.get(1);
        for (int i=0; i<s.length(); i++) {
            char ch = s.charAt(i);
            if (!(ch>'a' && ch<'z' || ch>'A' && ch<'Z')) {
                re.add(s.substring(0, i));
                re.add(s.substring(i));
                break;
            }
        }

        return re;
    }

    /** 获取属性名称。无效数据返回 null */
    @Override
    public String getName(String rawLine, List<String> items, AnalysisConfig config) {
        return items.size() > 1 ? items.get(0) : null;
    }

    /** 获取属性类型。无效数据返回 null */
    @Override
    public String getType(String rawLine, List<String> items, AnalysisConfig config) {
        if (items.size() < 2) {
            return null;
        }

        // custom
        String type =  items.get(1);
        String dataType = type;
        try {
            switch (type) {
                case "long": dataType = "Long"; break;
                case "number": dataType = "Integer"; break;
                case "string": dataType = "String"; break;
                case "integer": dataType = "Integer"; break;
                default: break;
            }
        } catch (Exception e) {
            throw e;
        }
        return dataType;
    }

    /** 获取属性类型 */
    @Override
    public String getDesc(String rawLine, List<String> items, AnalysisConfig config) {
        return  items.size() > 2 ? items.get(2) : null;
    }

    /** 解析结果是否有效，根据这个结果设置最后的 valid */
    @Override
    protected boolean isValid(BeanField beanField, AnalysisConfig config) {
        return !BaseDataAnalysis.isBlank(beanField.getName()) && !BaseDataAnalysis.isBlank(beanField.getType());
    }

    /** 后置处理 */
    @Override
    public void afterAnalysis(BeanField beanField, List<String> items, AnalysisConfig config) {
        // 未处理部分
        String rawLine = beanField.getRawLine();
        if (rawLine.length()>2) {
            List<String> unArrs = items.subList(2, items.size());
            beanField.setUnResolve(String.join("", unArrs));
        }

        // custom
        String desc = beanField.getDesc(); // 去掉 No
        if (desc!=null && desc.endsWith("No")) {
            desc = desc.substring(0, desc.length()-2);
            beanField.setDesc(desc);
        }

        // 统一bean设置注解
        if ("id".equals(beanField.getName())) {
            beanField.setAnnotations("    @Id");
        } else {
            beanField.setAnnotations("    @Column");
        }
    }


}
